home *** CD-ROM | disk | FTP | other *** search
/ Kit PC World De Ampliacion De Windows 95 / Kit PC World de ampliacion de Windows 95.iso / internet / sweeper / samples / olecon~1 / framewrk / dibcla~1.cpp < prev    next >
C/C++ Source or Header  |  1995-12-04  |  4KB  |  184 lines

  1. #include "IPServer.H"
  2.  
  3. #include "DibClasses.H"
  4.  
  5. #define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4)
  6.  
  7. //=--------------------------------------------------------------------------=
  8. // DIB Utitilty Classes
  9. //=--------------------------------------------------------------------------=
  10. // Not wholey generic but getting there...
  11. //
  12. // Notes:
  13. //
  14. CDibFile::CDibFile()
  15. {
  16.     m_headerSize = 0;
  17.     m_bmi.p = 0;
  18. }
  19.  
  20. CDibFile::~CDibFile()
  21. {
  22.     if( m_bmi.p )
  23.         delete m_bmi.p;
  24. }
  25.  
  26.  
  27. DWORD CDibFile::CalcImageSize()
  28. {
  29.     DWORD & dw = m_bmi.p->bmiHeader.biSizeImage;
  30.     if( dw == 0)
  31.         dw = WIDTHBYTES((DWORD)m_bmi.p->bmiHeader.biWidth *
  32.                 m_bmi.p->bmiHeader.biBitCount) * m_bmi.p->bmiHeader.biHeight;
  33.  
  34.     return(dw);
  35. }
  36.  
  37. HRESULT CDibFile::GetInfoHeader( IStream * strm )
  38. {
  39.     HRESULT hr = S_OK; m_bmi.bytes = new unsigned char[ m_headerSize ];
  40.  
  41.     if( !m_bmi.bytes )
  42.         hr = E_OUTOFMEMORY; 
  43.  
  44.     if( SUCCEEDED(hr) )
  45.         hr = strm->Read(m_bmi.bytes,m_headerSize,0);
  46.  
  47.     if( SUCCEEDED(hr) )
  48.         CalcImageSize();
  49.  
  50.     return(hr);
  51. }
  52.  
  53. HRESULT CDibFile::GetFileHeader(IStream * strm)
  54. {
  55.     BITMAPFILEHEADER    bmfh;
  56.  
  57.     HRESULT    hr = strm->Read(&bmfh,sizeof(bmfh),0);
  58.     
  59.     if( SUCCEEDED(hr) && (bmfh.bfType != 0x4d42 ))
  60.         hr = E_UNEXPECTED;
  61.  
  62.     if( SUCCEEDED(hr) )
  63.         m_headerSize = bmfh.bfOffBits - sizeof(bmfh);
  64.  
  65.     return(hr);
  66. }
  67.  
  68.  
  69. CDibSection::CDibSection()
  70. {
  71.     m_bitsBase    = 0;
  72.     m_current    = 0;
  73.     m_memDC        = 0;
  74.     m_handle    =
  75.     m_oldBitmap = 0;
  76.     m_w            = 
  77.     m_h            = 32;  // totally arbitrary
  78. }
  79.  
  80. CDibSection::~CDibSection()
  81. {
  82.     if( m_memDC )
  83.     {
  84.         if( m_oldBitmap )
  85.             ::SelectObject( m_memDC, m_oldBitmap );
  86.  
  87.         ::DeleteDC(m_memDC);
  88.     }
  89.  
  90.     if( m_handle )
  91.         ::DeleteObject(m_handle);
  92.  
  93. }
  94.     
  95.     
  96. HRESULT CDibSection::Create(CDibFile& dibFile)
  97. {
  98.     HRESULT                hr        = S_OK;
  99.     BITMAPINFOHEADER *    bmih    = dibFile;    // will convert itself
  100.  
  101.     m_handle = ::CreateDIBSection(
  102.                     m_memDC,                // handle to device context
  103.                     dibFile,                // pointer to structure containing bitmap size, 
  104.                                             //    format, and color data
  105.                     DIB_RGB_COLORS,            // color data type indicator: RGB values or 
  106.                                             //    palette indices
  107.                     (void **)&m_bitsBase,    // pointer to variable to receive a pointer 
  108.                                             //    to the bitmap's bit values
  109.                     0,                        // optional handle to a file mapping object
  110.                     0                        // offset to the bitmap bit values 
  111.                                             //    within the file mapping object
  112.                     );
  113.  
  114.     if( !m_handle )
  115.         hr = E_FAIL;
  116.     
  117.     if( SUCCEEDED(hr) )
  118.     {
  119.         m_oldBitmap = ::SelectObject( m_memDC, m_handle );
  120.         
  121.         if( !m_oldBitmap )
  122.             hr = E_FAIL;
  123.     }
  124.  
  125.     if( SUCCEEDED(hr) )
  126.     {
  127.         m_current = m_bitsBase;
  128.  
  129.         m_w = bmih->biWidth;
  130.         m_h = bmih->biHeight;
  131.         
  132.         if( m_h < 0 )
  133.             m_h *= -1;
  134.     }
  135.         
  136.     return(hr);
  137. }
  138.  
  139. HRESULT CDibSection::ReadFrom( IStream * strm, DWORD amount )
  140. {
  141.     HRESULT hr = strm->Read(m_current,amount,0);
  142.  
  143.     if( SUCCEEDED(hr) )
  144.         m_current += amount;
  145.  
  146.     return(hr);
  147. }
  148.  
  149.  
  150. HRESULT CDibSection::Setup(HDC hdc)
  151. {
  152.     m_memDC = ::CreateCompatibleDC(hdc);
  153.  
  154.     return( m_memDC ? NOERROR : E_FAIL );
  155. }
  156.  
  157.  
  158. HRESULT    CDibSection::PaintTo(HDC hdc, int x, int y)
  159. {
  160.     BOOL b = BitBlt(
  161.                  hdc,        // handle to destination device context 
  162.                  x,            // x-coordinate of destination rectangle's upper-left corner
  163.                  y,            // x-coordinate of destination rectangle's upper-left corner
  164.                  m_w,        // width of destination rectangle 
  165.                  m_h,        // height of destination rectangle 
  166.                  m_memDC,    // handle to source device context 
  167.                  0,            // x-coordinate of source rectangle's upper-left corner  
  168.                  0,            // y-coordinate of source rectangle's upper-left corner
  169.                  SRCCOPY    // raster operation code 
  170.                 );
  171.  
  172.     return( b ? NOERROR : E_FAIL );
  173. }
  174.  
  175. HRESULT    CDibSection::GetSize(SIZEL &sz)
  176. {
  177.     sz.cx = m_w;
  178.     sz.cy = m_h;
  179.  
  180.     return(S_OK);
  181. }
  182.  
  183.  
  184.